@@ -8,13 +8,14 @@ |
||
8 | 8 |
#= require ./worker-checker |
9 | 9 |
#= require_self |
10 | 10 |
|
11 |
-setupJsonEditor = -> |
|
11 |
+window.setupJsonEditor = ($editor = $(".live-json-editor")) -> |
|
12 | 12 |
JSONEditor.prototype.ADD_IMG = '<%= image_path 'json-editor/add.png' %>' |
13 | 13 |
JSONEditor.prototype.DELETE_IMG = '<%= image_path 'json-editor/delete.png' %>' |
14 |
- if $(".live-json-editor").length |
|
15 |
- window.jsonEditor = new JSONEditor($(".live-json-editor"), 400, 500) |
|
16 |
- window.jsonEditor.doTruncation true |
|
17 |
- window.jsonEditor.showFunctionButtons() |
|
14 |
+ if $editor.length |
|
15 |
+ jsonEditor = new JSONEditor($editor, $editor.data('width') || 400, $editor.data('height') || 500) |
|
16 |
+ jsonEditor.doTruncation true |
|
17 |
+ jsonEditor.showFunctionButtons() |
|
18 |
+ return jsonEditor |
|
18 | 19 |
|
19 | 20 |
hideSchedule = -> |
20 | 21 |
$(".schedule-region select").hide() |
@@ -45,7 +46,7 @@ showEventDescriptions = -> |
||
45 | 46 |
|
46 | 47 |
$(document).ready -> |
47 | 48 |
# JSON Editor |
48 |
- setupJsonEditor() |
|
49 |
+ window.jsonEditor = setupJsonEditor() |
|
49 | 50 |
|
50 | 51 |
# Select2 Selects |
51 | 52 |
$(".select2").select2(width: 'resolve') |
@@ -8,6 +8,16 @@ class AgentsController < ApplicationController |
||
8 | 8 |
end |
9 | 9 |
end |
10 | 10 |
|
11 |
+ def handle_details_post |
|
12 |
+ @agent = current_user.agents.find(params[:id]) |
|
13 |
+ if @agent.respond_to?(:handle_details_post) |
|
14 |
+ render :json => @agent.handle_details_post(params) || {} |
|
15 |
+ else |
|
16 |
+ @agent.error "#handle_details_post called on an instance of #{@agent.class} that does not define it." |
|
17 |
+ head 500 |
|
18 |
+ end |
|
19 |
+ end |
|
20 |
+ |
|
11 | 21 |
def run |
12 | 22 |
agent = current_user.agents.find(params[:id]) |
13 | 23 |
Agent.async_check(agent.id) |
@@ -0,0 +1,32 @@ |
||
1 |
+module Agents |
|
2 |
+ class ManualEventAgent < Agent |
|
3 |
+ cannot_be_scheduled! |
|
4 |
+ cannot_receive_events! |
|
5 |
+ |
|
6 |
+ description <<-MD |
|
7 |
+ Use this Agent to manually create Events for testing or other purposes. |
|
8 |
+ MD |
|
9 |
+ |
|
10 |
+ event_description "User determined" |
|
11 |
+ |
|
12 |
+ def default_options |
|
13 |
+ { "no options" => "are needed" } |
|
14 |
+ end |
|
15 |
+ |
|
16 |
+ def handle_details_post(params) |
|
17 |
+ if params[:payload] |
|
18 |
+ create_event(:payload => params[:payload]) |
|
19 |
+ { :success => true } |
|
20 |
+ else |
|
21 |
+ { :success => false, :error => "You must provide a JSON payload" } |
|
22 |
+ end |
|
23 |
+ end |
|
24 |
+ |
|
25 |
+ def working? |
|
26 |
+ true |
|
27 |
+ end |
|
28 |
+ |
|
29 |
+ def validate_options |
|
30 |
+ end |
|
31 |
+ end |
|
32 |
+end |
@@ -0,0 +1,42 @@ |
||
1 |
+<h3>Manually Create Events</h3> |
|
2 |
+ |
|
3 |
+<h4 id='event-creation-status'></h4> |
|
4 |
+ |
|
5 |
+<%= form_tag handle_details_post_agent_path(@agent), :id => "create-event-form" do %> |
|
6 |
+ <div class="control-group"> |
|
7 |
+ <textarea rows="10" id="payload" name="payload" class="span8 payload-editor" data-height="200"> |
|
8 |
+ {} |
|
9 |
+ </textarea> |
|
10 |
+ </div> |
|
11 |
+ |
|
12 |
+ <div class='form-actions' style='clear: both'> |
|
13 |
+ <%= submit_tag "Submit", :class => "btn btn-primary" %> |
|
14 |
+ </div> |
|
15 |
+<% end %> |
|
16 |
+ |
|
17 |
+<script> |
|
18 |
+ $(function () { |
|
19 |
+ var payloadJsonEditor = window.setupJsonEditor($(".payload-editor")); |
|
20 |
+ $("#create-event-form").submit(function (e) { |
|
21 |
+ e.preventDefault(); |
|
22 |
+ var $form = $("#create-event-form"); |
|
23 |
+ var $status = $("#event-creation-status"); |
|
24 |
+ $.ajax({ |
|
25 |
+ url: $form.attr('action'), |
|
26 |
+ method: "post", |
|
27 |
+ data: { payload: JSON.parse($form.find("textarea").val()) }, |
|
28 |
+ dataType: "JSON", |
|
29 |
+ success: function(json) { |
|
30 |
+ if (json.success) { |
|
31 |
+ $status.text("Success!"); |
|
32 |
+ } else { |
|
33 |
+ $status.text("An error occurred: " + json.error); |
|
34 |
+ } |
|
35 |
+ }, |
|
36 |
+ error: function(response) { |
|
37 |
+ $status.text("An error occurred: " + response.responseText) |
|
38 |
+ } |
|
39 |
+ }); |
|
40 |
+ }); |
|
41 |
+ }); |
|
42 |
+</script> |
@@ -132,12 +132,12 @@ |
||
132 | 132 |
|
133 | 133 |
<p> |
134 | 134 |
<b>Options:</b> |
135 |
- <pre><%= JSON.pretty_generate @agent.options %></pre> |
|
135 |
+ <pre><%= JSON.pretty_generate @agent.options || {} %></pre> |
|
136 | 136 |
</p> |
137 | 137 |
|
138 | 138 |
<p> |
139 | 139 |
<b>Memory:</b> |
140 |
- <pre><%= JSON.pretty_generate @agent.memory %></pre> |
|
140 |
+ <pre><%= JSON.pretty_generate @agent.memory || {} %></pre> |
|
141 | 141 |
</p> |
142 | 142 |
</div> |
143 | 143 |
</div> |
@@ -16,6 +16,7 @@ |
||
16 | 16 |
</tr> |
17 | 17 |
|
18 | 18 |
<% @events.each do |event| %> |
19 |
+ <% next unless event.agent %> |
|
19 | 20 |
<tr> |
20 | 21 |
<td><%= link_to event.agent.name, agent_path(event.agent) %></td> |
21 | 22 |
<td><%= time_ago_in_words event.created_at %> ago</td> |
@@ -7,7 +7,7 @@ |
||
7 | 7 |
|
8 | 8 |
<p> |
9 | 9 |
<b>Payload:</b> |
10 |
- <pre><%= JSON.pretty_generate @event.payload %></pre> |
|
10 |
+ <pre><%= JSON.pretty_generate @event.payload || {} %></pre> |
|
11 | 11 |
</p> |
12 | 12 |
|
13 | 13 |
<% if @event.lat && @event.lng %> |
@@ -2,6 +2,7 @@ Huginn::Application.routes.draw do |
||
2 | 2 |
resources :agents do |
3 | 3 |
member do |
4 | 4 |
post :run |
5 |
+ post :handle_details_post |
|
5 | 6 |
delete :remove_events |
6 | 7 |
end |
7 | 8 |
|
@@ -18,6 +18,22 @@ describe AgentsController do |
||
18 | 18 |
end |
19 | 19 |
end |
20 | 20 |
|
21 |
+ describe "POST handle_details_post" do |
|
22 |
+ it "passes control to handle_details_post on the agent" do |
|
23 |
+ sign_in users(:bob) |
|
24 |
+ post :handle_details_post, :id => agents(:bob_manual_event_agent).to_param, :payload => { :foo => "bar" } |
|
25 |
+ JSON.parse(response.body).should == { "success" => true } |
|
26 |
+ agents(:bob_manual_event_agent).events.last.payload.should == { :foo => "bar" } |
|
27 |
+ end |
|
28 |
+ |
|
29 |
+ it "can only be accessed by the Agent's owner" do |
|
30 |
+ sign_in users(:jane) |
|
31 |
+ lambda { |
|
32 |
+ post :handle_details_post, :id => agents(:bob_manual_event_agent).to_param, :payload => { :foo => :bar } |
|
33 |
+ }.should raise_error(ActiveRecord::RecordNotFound) |
|
34 |
+ end |
|
35 |
+ end |
|
36 |
+ |
|
21 | 37 |
describe "GET show" do |
22 | 38 |
it "only shows Agents for the current user" do |
23 | 39 |
sign_in users(:bob) |
@@ -92,3 +92,8 @@ bob_twitter_user_agent: |
||
92 | 92 |
:oauth_token => "---", |
93 | 93 |
:oauth_token_secret => "---" |
94 | 94 |
}.to_yaml.inspect %> |
95 |
+ |
|
96 |
+bob_manual_event_agent: |
|
97 |
+ type: Agents::ManualEventAgent |
|
98 |
+ user: bob |
|
99 |
+ name: "Bob's event testing agent" |
@@ -69,10 +69,6 @@ describe Agents::PeakDetectorAgent do |
||
69 | 69 |
:pattern => { :filter => "something" }) |
70 | 70 |
@agent.memory[:peaks][:something].length.should == 2 |
71 | 71 |
end |
72 |
- |
|
73 |
- it "works on real world data" do |
|
74 |
- pending "need examples" |
|
75 |
- end |
|
76 | 72 |
end |
77 | 73 |
|
78 | 74 |
describe "validation" do |
@@ -95,4 +91,4 @@ describe Agents::PeakDetectorAgent do |
||
95 | 91 |
@agent.should_not be_valid |
96 | 92 |
end |
97 | 93 |
end |
98 |
-end |
|
94 |
+end |